Fork me on GitHub
余鸢

Spring Session-HttpSession(快速入门)

本指南介绍如何使用Spring Session透明地利用Redis来通过Java配置来回退Web应用程序的HttpSession。

完成的指南可以在httpsession sample application中找到。

Updating Dependencies

在使用Spring Session之前,必须确保更新依赖项。 如果您使用Maven,请确保添加以下依赖项:

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>1.3.0.RELEASE</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>biz.paluch.redis</groupId>
<artifactId>lettuce</artifactId>
<version>3.5.0.Final</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
</dependencies>

Spring Java Configuration

添加所需的依赖项后,我们可以创建我们的Spring配置。 Spring配置负责创建一个Servlet过滤器,它用Spring Session支持的实现替换HttpSession实现。 添加以下Spring配置:

1
2
3
4
5
6
7
8
@EnableRedisHttpSession
public class Config {
@Bean
public LettuceConnectionFactory connectionFactory() {
return new LettuceConnectionFactory();
}
}

@EnableRedisHttpSession注释创建一个名为springSessionRepositoryFilter的Spring Bean,它实现了Filter。 过滤器是负责替换HttpSession实现由Spring Session支持。 在这个例子中,Spring Session由Redis支持。

我们创建一个RedisConnectionFactory,将Spring Session连接到Redis服务器。 我们配置连接以连接到默认端口(6379)上的localhost有关配置Spring Data Redis的更多信息,请参考reference documentation

Java Servlet容器初始化

我们的 Spring Configuration 创建了一个Spring Bean,名为springSessionRepositoryFilter,它实现了Filter。 springSessionRepositoryFilter bean负责用Spring Session支持的自定义实现替换HttpSession。

为了使我们的Filter能够做到这一点,Spring需要加载我们的Config类。 最后,我们需要确保我们的Servlet容器(即Tomcat)对于每个请求使用我们的springSessionRepositoryFilter。 幸运的是,Spring Session提供了一个名为AbstractHttpSessionApplicationInitializer的实用程序类,这两个步骤都非常容易。 你可以找到一个例子:

src/main/java/sample/Initializer.java

1
2
3
4
5
6
public class Initializer extends AbstractHttpSessionApplicationInitializer {
public Initializer() {
super(Config.class);
}
}

我们的类的名字(Initializer)没关系。 重要的是我们扩展AbstractHttpSessionApplicationInitializer。

第一步是扩展AbstractHttpSessionApplicationInitializer。 这确保Spring Bean的名称为springSessionRepositoryFilter,为每个请求的Servlet容器注册。
AbstractHttpSessionApplicationInitializer还提供了一种机制,以轻松确保Spring加载我们的Config

httpsession示例应用程序

运行httpsession示例应用程序

您可以通过获取 source code并调用以下命令来运行示例:

要使样本工作,必须在localhost上安装install Redis 2.8+,并使用默认端口(6379)运行它。 或者,您可以更新LettuceConnectionFactory以指向Redis服务器。

1
$ ./gradlew :samples:httpsession:tomcatRun

您现在应该可以访问http://localhost:8080/

探索httpsession示例应用程序

尝试使用应用程序。 使用以下信息填写表单:

  • Attribute Name:username

  • Attribute Value:rob

现在单击Set Attribute按钮。 现在应该可以看到表中显示的值。

How does it work?

我们在SessionServlet中与标准HttpSession进行交互,如下所示:

src/main/java/sample/SessionServlet.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@WebServlet("/session")
public class SessionServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String attributeName = req.getParameter("attributeName");
String attributeValue = req.getParameter("attributeValue");
req.getSession().setAttribute(attributeName, attributeValue);
resp.sendRedirect(req.getContextPath() + "/");
}
private static final long serialVersionUID = 2878267318695777395L;
}

而不是使用Tomcat的HttpSession,我们实际上是在Redis中保留值。 Spring会在您的浏览器中创建一个名为SESSION的cookie,其中包含会话的ID。 继续并查看Cookie(点击获取Chrome或Firefox的帮助)。

如果你喜欢,你可以很容易地删除会话使用redis-cli。 例如,在基于Linux的系统上,您可以输入:

1
$ redis-cli keys '*' | xargs redis-cli del

Redis文档中有关于installing redis-cli的说明。

或者,你也可以删除显式键。 在终端输入以下内容,确保用你的SESSION cookie的值替换7e8383a4-082c-4ffe-a4bc-c40fd3363c5e

1
$ redis-cli del spring:session:sessions:7e8383a4-082c-4ffe-a4bc-c40fd3363c5e

现在访问http://localhost:8080/ 的应用程序,并观察我们添加的属性不再显示。

注:翻译自http://docs.spring.io/spring-session/docs/current/reference/html5/guides/httpsession.html